package com.cq.xjms.service;

import java.util.List;
import java.util.Map;

import javax.persistence.Query;

import org.extremecomponents.table.limit.Limit;

import com.cq.xjms.model.BaseEntity;
/**
 * Service基础类接口
 */
public interface BaseManager <T extends BaseEntity> {
	public Query query(String hql);
	public Query namedQuery(String name) ;
	public Query nativeQuery(String sql);

	/**
	 * 根据ID加载实体对象
	 */
	@SuppressWarnings("unchecked")
	public T load(Class clazz, Long id);

	/**
	 * 保存实体对象
	 */
	public void save(T entity);

	/**
	 * 更新实体对象
	 */
	public void update(T entity);

	/**
	 * 保存或更新实体对象
	 */
	public void saveOrUpdate(T entity);

	/**
	 * 根据删除实体对象
	 */
	@SuppressWarnings("unchecked")
	public void remove(Class clazz, Long id);

	/**
	 * 命名HQL查询记录总数
	 * 
	 * queryName: 命名查询
	 */
	public int count(String queryName);

	/**
	 * 命名HQL查询符合条件记录总数
	 * 
	 * queryName: 命名查询 parameters map: 查询条件
	 */
	public int count(String queryName, Map<String, Object> parameters);

	public int countByHQL(String queryHQL, Map<String, Object> parameters);

	/**
	 * 命名HQL查询记录
	 * 
	 * queryName: 命名查询
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(String queryName);

	/**
	 * 命名HQL查询记录带分页
	 * 
	 * queryName: 命名查询
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(String queryName, Limit limit);

	/**
	 * 命名HQL查询符合条件记录
	 * 
	 * queryName: 命名查询 parameters map: 查询条件
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(String queryName, Map<String, Object> parameters);

	/**
	 * 命名HQL查询符合条件记录带分页
	 * 
	 * queryName: 命名查询 parameters map: 查询条件
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(String queryName, Map<String, Object> parameters,
			Limit limit);
	@SuppressWarnings("unchecked")
	public List<T> findByHQL(String queryHQL, Map<String, Object> parameters,
			Limit limit);
	/**
	 * 根据命名HQL更新操作
	 * 
	 * queryName: 命名查询 parameters map: 查询条件
	 */
	public void update(String queryName, Map<String, Object> parameters);
	
}
